import {
  UniCloudError,
  resolveUrl
} from '../../../share/index'
import {
  callQQOpenApi
} from '../normalize'
export default class Auth {
  constructor (options) {
    this.options = Object.assign({
      baseUrl: 'https://graph.qq.com',
      timeout: 5000
    }, options)
  }

  async _requestQQOpenapi ({ name, url, data, options }) {
    const defaultOptions = {
      method: 'GET',
      dataType: 'json',
      dataAsQueryString: true,
      timeout: this.options.timeout
    }
    const result = await callQQOpenApi({
      name: `auth.${name}`,
      url: resolveUrl(this.options.baseUrl, url),
      data,
      options,
      defaultOptions
    })
    return result
  }

  // async getUserInfo ({
  //   accessToken,
  //   openid
  // } = {}) {
  //   const url = '/user/get_user_info'
  //   const result = await this._requestQQOpenapi({
  //     name: 'getUserInfo',
  //     url,
  //     data: {
  //       oauthConsumerKey: this.options.appId,
  //       accessToken,
  //       openid
  //     }
  //   })
  //   return result
  // }

  async getOpenidByToken ({
    accessToken
  } = {}) {
    const url = '/oauth2.0/me'
    const result = await this._requestQQOpenapi({
      name: 'getOpenidByToken',
      url,
      data: {
        accessToken,
        unionid: 1,
        fmt: 'json'
      }
    })
    if (result.clientId !== this.options.appId) {
      throw new UniCloudError({
        code: 'APPID_NOT_MATCH',
        message: 'appid not match'
      })
    }
    return {
      openid: result.openid,
      unionid: result.unionid
    }
  }

  async code2Session ({
    code
  } = {}) {
    const url = 'https://api.q.qq.com/sns/jscode2session'
    const result = await this._requestQQOpenapi({
      name: 'getOpenidByToken',
      url,
      data: {
        grant_type: 'authorization_code',
        appid: this.options.appId,
        secret: this.options.secret,
        js_code: code
      }
    })
    return result
  }
}
